package site.beanyon.now.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import site.beanyon.now.mapper.TimeSpanMapper;
import site.beanyon.now.model.dto.TimeSpanDTO;
import site.beanyon.now.model.po.TimeSpanPO;
import site.beanyon.now.util.DateUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 时间区间相关服务类
 */
@Service
public class TimeSpanServiceImpl implements TimeSpanService {
    @Autowired
    private TimeSpanMapper timeSpanMapper;

    /**
     * 根据时间卡片id获取时间区间列表
     *
     * @param timeCardId 时间卡片id
     * @return 时间区间列表
     */
    @Override
    public List<TimeSpanDTO> listTimeSpan(Integer timeCardId) {
        List<TimeSpanPO> timeSpanPOList = this.timeSpanMapper.listTimeSpan(timeCardId);
        return convertPOtoDTO(timeSpanPOList);
    }

    /**
     * 创建时间区间
     *
     * @param timeSpanPO 时间卡片对象
     * @return 是否创建成功
     */
    @Override
    public boolean createTimeSpan(TimeSpanPO timeSpanPO) {
        return this.timeSpanMapper.insertTimeSpan(timeSpanPO).equals(1);
    }

    /**
     * 更新开始时间
     *
     * @param spanId    时间区间id
     * @param startTime 开始时间
     * @return 是否更新成功
     */
    @Override
    public boolean updateStartTime(Integer spanId, Long startTime) {
        String timeStr = DateUtils.getFullTimeByTimestamp(startTime);
        return this.timeSpanMapper.updateStartTime(spanId, timeStr).equals(1);
    }

    /**
     * 更新结束时间
     *
     * @param spanId  时间区间id
     * @param endTime 结束时间
     * @return 是否更新成功
     */
    @Override
    public boolean updateEndTime(Integer spanId, Long endTime) {
        String timeStr = DateUtils.getFullTimeByTimestamp(endTime);
        return this.timeSpanMapper.updateEndTime(spanId, timeStr).equals(1);
    }

    /**
     * 将PO列表转为DTO列表
     *
     * @param timeSpanPOList 时间区间PO列表
     * @return 时间区间DTO列表
     */
    private List<TimeSpanDTO> convertPOtoDTO(List<TimeSpanPO> timeSpanPOList) {
        List<TimeSpanDTO> timeSpanDTOList = new ArrayList<>(timeSpanPOList.size());

        for (TimeSpanPO timeSpanPO : timeSpanPOList) {
            timeSpanDTOList.add(new TimeSpanDTO(timeSpanPO));
        }

        return timeSpanDTOList;
    }
}
